package com.biao.aop;

import com.biao.annotation.MyTransactional;
import com.biao.template.MyConnectionManager;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.sql.Connection;

/**
 * 将自定义的事务注解，使用AOP的方式，来增强它的功能
 * @author: chenwenbiao
 * @create: 2020-2-2 18:35
 */
@Aspect
@Component
public class MyTransactionalAspect {

    @Autowired
    private MyConnectionManager connectionManager;

    /**
     * 让标记着@myTransactional注解的方法，不直接调用，而是在该方法前后增加代码，增强该方法功能
     * @param proceedingJoinPoint
     * @param myTransactional 这个是增强点的定义，也就是说当遇到这个增强点标签（这里是@MyTransactional）时，就切入到它的代码中，@MyTransactional就是切入点
     *                        可以参考：https://www.cnblogs.com/ssslinppp/p/5845659.html
     * @throws Throwable
     */
    @Around("@annotation(myTransactional)")
    public void doTransactional(ProceedingJoinPoint proceedingJoinPoint, MyTransactional myTransactional) throws Throwable {
        Connection conn = null;
        try {
            /**
             * 方法执行前增强
             */
            System.out.println("setAutoCommit false");
            conn = connectionManager.getConnection();
            conn.setAutoCommit(false);

            /**
             * 调用实际的方法，即标注@myTransactional注解的方法
             */
            proceedingJoinPoint.proceed();

            /**
             * 方法执行后增强
             */
            conn.commit();
            System.out.println("=====事务提交======");
        } catch (Exception e) {
            e.printStackTrace();
            conn.rollback();
            System.out.println("=====事务回滚=====");
            throw new Exception();
        }
    }
}
